批量修改 Git 提交中的用户名和邮箱信息
为什么要修改 Git 提交历史?
- 错误用户信息:误用个人邮箱而非公司邮箱。
- 统一管理:为团队协作统一提交信息。
- 隐私保护:隐藏真实用户信息。
一键批量修改脚本
使用 git filter-branch
修改提交历史的用户名和邮箱:
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="旧邮箱@example.com"
CORRECT_NAME="新用户名"
CORRECT_EMAIL="新邮箱@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]; then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]; then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
注意事项
- 备份仓库:操作前用
git clone --mirror
备份。 - 多人协作:修改历史会更改提交哈希,需提前通知协作者。
- 不可逆操作:理解操作原理后再执行。
git filter-branch
常用功能
基本用法:
git filter-branch [选项] <filter> -- --all
--all
:应用到所有分支。<filter>
:指定操作类型。
常用选项:
--env-filter
:修改作者/提交者信息。--tree-filter
:修改文件内容或删除文件(较慢)。--index-filter
:高效修改暂存区文件。--commit-filter
:自定义提交信息。--tag-name-filter
:更新标签。--prune-empty
:删除空提交。
示例
修改用户信息:
git filter-branch --env-filter ' OLD_EMAIL="旧邮箱@example.com" CORRECT_NAME="新用户名" CORRECT_EMAIL="新邮箱@example.com" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]; then export GIT_COMMITTER_NAME="$CORRECT_NAME" export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]; then export GIT_AUTHOR_NAME="$CORRECT_NAME" export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" fi ' -- --all
删除文件:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch .env' -- --all
替代工具
git filter-repo
:比 git filter-branch
更快、更易用,适合大规模仓库清理。
常见问题
修改历史会影响安全性吗? 不会直接影响,但可能导致同步问题,需备份并通知团队。
其他开发者如何同步? 需重新拉取代码,可能需解决冲突。
其他修改方法?
git commit --amend
:修改最近提交。git rebase -i
:交互式修改多条提交。
管理 Git 用户信息提示
- 全局配置:
git config --global user.name "Your Name" git config --global user.email "your_email@example.com"
- 项目级配置:在
.git/config
设置本地用户信息。 - 检查提交信息:提交前确认用户名和邮箱。
Comments